//#ifndef TWOPHASESPARRALLELDBOPERATIONMODELGENERATOR2_H_JM_20120918
//#define TWOPHASESPARRALLELDBOPERATIONMODELGENERATOR2_H_JM_20120918
///** @file TwoPhasesParrallelHashActionModelGenerator.h
// * Generator jednoprechodoveho algoritmu pre DB operacie.
// **/
//#include "ModelGenerator.h"
//#include "Slices.h"
//
//namespace jm4bbx {
//	/**  Generator modelu pre DB operacie vykonane v jednom priechode.
//	 *   Logika vykonania operacie je zalozena na hashovani.
//	 *   Vygenerovany model je zlozeny z dvoch faz, kde sa kazda cast 
//	 *   paralelizuje podla dodaneho sablonoveho argumentu N.
//	 *  
//	 *  Priklad vygenerovaneho modelu pre paralelizacny faktor N == 4.
//	 * @verbatim                      
//	 *                                 hashovanie dat      vyhladavanie dat vacsej           
//	 *                                 mensej relacie      relacie v hash. tabulke 
//	 *                                  do tabulky         a vykonanie DB operacie  
//	 *                               _______##_______         _______##_______         
//	 *                              |       ##       |       |       ##       |        
//	 *                              |                |       |                |        
//	 *            load    start     |_______##_______|       |_______##_______|     stop   output    
//	 *    input   data    timer   fork      ##     merge   fork      ##     merge   timer   data   output
//	 *     ##______##______##______##               ##______##               ##______##______##______##
//	 *     ##      ##      ##      ##               ##      ##               ##      ##      ##      ##
//	 *                              |_______##_______|       |_______##_______|        
//	 *                              |       ##       |       |       ##       |        
//	 *                              |                |       |                |        
//	 *                              |_______##_______|       |_______##_______|        
//	 *                                      ##                       ##                
//	 * @endverbatim                                    
//	 * 
//	 * @tparam N paralelizacny faktor
//	 **/
//	template<size_t N>
//	class  TwoPhasesParrallelHashActionModelGenerator2 : public ModelGenerator {
//	public:
//
//		std::string typeName_;
//
//		TwoPhasesParrallelHashActionModelGenerator(	
//			const std::string& inputBoxName1,
//			const std::string& inputBoxName2,
//			const std::string& hashBoxName,
//			const std::string& actionBoxName,
//			const std::string& outputBoxName,
//			const std::string& typeName,
//			const int operandColumns = 2,
//			const int resultColumns = 1)  {
//
//				const int columns = operandColumns + resultColumns;
//				typeName_ = typeName;
//
//				BoxDescriptorPtr dataFork = addBox("Fork", genBoxParam("forkFactor", 2));
//				
//				
//				BoxDescriptorPtr loadDataC1 = addBox(inputBoxName1);
//				BoxDescriptorPtr loadDataC2 = addBox(inputBoxName2);
//				
//
//
//
//				//BoxDescriptorPtr startTimer = addBox("Timer");
//
//				BoxDescriptorPtr fork1 = addBox("Fork", genBoxParam("forkFactor", N));
//				BoxDescriptorPtr hash = addBox(hashBoxName, N);
//				BoxDescriptorPtr merge1 = addBox("Merge", genBoxParam("mergeFactor", N));
//				
//				BoxDescriptorPtr fork2 = addBox("Fork", genBoxParam("forkFactor", N));
//				BoxDescriptorPtr join = addBox(actionBoxName, N);
//				BoxDescriptorPtr merge2 = addBox("Merge", genBoxParam("mergeFactor", N));
//				
//				//BoxDescriptorPtr stopTimer = addBox("Timer");
//
//				BoxDescriptorPtr outData = addBox(outputBoxName, genBoxParam("Psss", 1));
//				
//				
//				addSlice<PlainSlice>(getModelInputId(), loadData->getBoxId());
//
//
//				addSlice<PlainSlice>(loadData->getBoxId(), 
//					startTimer->getBoxId(), genTypes(typeName,	2));
//
//				addSlice<PlainSlice>(startTimer->getBoxId(), fork1->getBoxId(), 
//					genTypes(typeName, 2));
//
//
//
//				generateForkActivityMerge(fork1,hash,merge1,fork2, 2, 1);
//				generateForkActivityMerge(fork2,join,merge2, stopTimer, 1, 1);
//
//
//				addSlice<PlainSlice>(stopTimer->getBoxId(), 
//					outData->getBoxId(), genTypes(typeName, 1));
//
//				addSlice<PlainSlice>(outData->getBoxId(), getModelOutputId());
//		}
//
//	private:
//
//		void generateForkActivityMerge(BoxDescriptorPtr& fork, 
//			BoxDescriptorPtr& activity, BoxDescriptorPtr& merge, 
//			BoxDescriptorPtr& out, int columns, int resultColumns) {
//
//				addSlice<ForkSlice<N>>(fork->getBoxId(), 
//					activity->getBoxIds(), genTypes(typeName_, columns));
//
//				addSlice<MergeSlice<N>>(activity->getBoxIds(), 
//					merge->getBoxId(), genTypes(typeName_, resultColumns));
//
//				addSlice<PlainSlice>(merge->getBoxId(), out->getBoxId(), 
//					genTypes(typeName_, resultColumns));
//		}
//	};
//
//} // namespace jm4bbx
//
//
//
//#endif
